home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-06-28 | 2.3 KB | 142 lines | [TEXT/CWIE] |
- // Tree.cp
-
- #ifndef Tree_h
- #include "Tree.h"
- #endif
- #ifndef TreeNode_h
- #include "TreeNode.h"
- #endif
-
- Tree::Tree()
- : root( 0 )
- {
- }
-
- Tree::~Tree()
- {
- Assert( IsEmpty() );
- }
-
- void Tree::Add( TreeNode& toAdd, AtRoot )
- {
- Assert( toAdd.tree == 0 );
- Assert( toAdd.left == 0 );
- Assert( toAdd.right == 0 );
- Assert( toAdd.parent == 0 );
-
- Assert( root == 0 );
-
- WillAdd( toAdd, after, 0 );
-
- toAdd.tree = this;
- root = &toAdd;
- }
-
- void Tree::Add( TreeNode& toAdd, Before, const TreeNode& next )
- {
- Assert( toAdd.tree == 0 );
- Assert( toAdd.left == 0 );
- Assert( toAdd.right == 0 );
- Assert( toAdd.parent == 0 );
-
- Assert( next.tree == this );
- Assert( next.left == 0 );
-
- WillAdd( toAdd, before, &next );
-
- TreeNode& mutableNext( const_cast<TreeNode&>( next ) );
-
- toAdd.tree = this;
- mutableNext.left = &toAdd;
- toAdd.parent = &mutableNext;
- }
-
- void Tree::Add( TreeNode& toAdd, After, const TreeNode& previous )
- {
- Assert( toAdd.tree == 0 );
- Assert( toAdd.left == 0 );
- Assert( toAdd.right == 0 );
- Assert( toAdd.parent == 0 );
-
- Assert( previous.tree == this );
- Assert( previous.right == 0 );
-
- WillAdd( toAdd, after, &previous );
-
- TreeNode& mutablePrevious( const_cast<TreeNode&>( previous ) );
-
- toAdd.tree = this;
- mutablePrevious.right = &toAdd;
- toAdd.parent = &mutablePrevious;
- }
-
- void Tree::Remove( TreeNode& toRemove )
- {
- Assert( toRemove.tree == this );
- Assert( toRemove.left == 0 );
- Assert( toRemove.right == 0 );
-
- WillRemove( toRemove );
-
- toRemove.LinkFromAbove() = 0;
- toRemove.parent = 0;
- toRemove.tree = 0;
- }
-
- void Tree::RemoveAll()
- {
- TreeNode *n = root;
-
- while ( n != 0 )
- {
- if ( n->left != 0 )
- n = n->left;
- else if ( n->right != 0 )
- n = n->right;
- else
- {
- TreeNode& toRemove( *n );
- n = n->parent;
- Remove( toRemove );
- }
- }
- }
-
- TreeNode *Tree::FirstNode() const
- {
- if ( root == 0 )
- return 0;
-
- TreeNode *n = root;
- while ( n->left != 0 )
- n = n->left;
-
- return n;
- }
-
- TreeNode *Tree::LastNode() const
- {
- if ( root == 0 )
- return 0;
-
- TreeNode *n = root;
- while ( n->right != 0 )
- n = n->right;
-
- return n;
- }
-
- bool Tree::Valid() const
- {
- if ( root != 0 && root->parent != 0 )
- return false;
-
- for ( const TreeNode *n = First(); n != 0; n = n->Next() )
- if ( !n->Valid() )
- return false;
-
- return true;
- }
-
- #include "Sequence.cp"
-